#include "xndchip_serial.h"
#include "ui_xndchip_serial.h"
#include "utilities.h"
#include "QComboBox"
#include "QStackedWidget"
#include <QtSerialPort/QSerialPortInfo>
#include <QMessageBox>
#include <QString>
#include <QDebug>
#include <QTime>
#include <QStatusBar>
#include <QStringList>
#include <iterator>

static uint8_t chip_number = 0;

XNDchip_Serial::XNDchip_Serial(QWidget *parent) :QMainWindow(parent),
    ui(new Ui::XNDchip_Serial)
{
    ui->setupUi(this);

    /* 连接信号槽 */
    connect(ui->CHIP_comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
                    ui->XND_stackedWidget, &QStackedWidget::setCurrentIndex);
    /* 创建一个串口 */
    this->port = new QSerialPort(this);

//    DataLimit();

    initSattusbar();

    initPort();
}

XNDchip_Serial::~XNDchip_Serial()
{
    delete ui;
}

/* 状态栏设置函数 */
void XNDchip_Serial::initSattusbar()
{
    portStatus = new QLabel("串口状态： 关闭");
    portStatus->setMinimumSize(200, 20);            /* 设置尺寸大小 */
    portStatus->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(portStatus);

    workStatus = new QLabel("工作模式： 无操作");
    workStatus->setMinimumSize(200, 20);
    workStatus->setAlignment(Qt::AlignHCenter);
    statusBar()->addWidget(workStatus);

    /* 设置边框及字体、大小 */
    statusBar()->setFont(QFont("微软雅黑", 11, QFont::Bold));
}

void XNDchip_Serial::initPort()
{
    QStringList serialNamePort;
    /* 列出当前系统中可用的串口 */
    QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
    if(infos.isEmpty())
    {
        ui->serialCb->addItem(tr("Empty"));
        return;
    }
    else
    {
        foreach (const QSerialPortInfo &info, infos) {
            serialNamePort << info.portName();
        }
        ui->serialCb->addItems(serialNamePort);
    }
    /* 进制选择默认 */
//    ui->checkBox->setChecked(false);                    /*默认10进制显示*/
}

void XNDchip_Serial::portconfig()
{
    /* 获取下拉框配置项文本 */
    str_port = ui->serialCb->currentText();
    str_baudrate = ui->baundrateCb->currentText();

    /* 设置串口 */
    port->setPortName(str_port);

    /* 如果打开串口成功 */
    if(port->open(QIODevice::ReadWrite))
    {
        /* 设置波特率 */
        port->setBaudRate(str_baudrate.toInt());

        /* 设置数据位 */
        port->setDataBits(QSerialPort::Data8);

        /* 设置停止位 */
        port->setStopBits(QSerialPort::OneStop);

        /* 设置校验位 */
        port->setParity(QSerialPort::NoParity);

        portisOpen = true;      /* 打开成功 */
    }
    else
    {
        portisOpen = false;     /* 打开失败 */
        QMessageBox::warning(this, "错误提示", "串口打开失败！！！");
    }
}

void XNDchip_Serial::on_OpenButton_clicked()
{
    /* 打开串口 */
    if(!portisOpen)
    {
        portconfig();       /* 调用串口配置参数 */
        /* 串口配置成功 */
        if(portisOpen)
        {
            ui->OpenButton->setText(tr("关闭"));
            ui->OpenButton->setStyleSheet("background-color:rgb(0,255,0);");     /* 设置样式 */

            /* 更改串口状态 */
            portStatus->setText("串口状态：打开");
            QString chipTypeStr = ui->CHIP_comboBox->currentText();
            chip_number = getChipType(chipTypeStr);
            qDebug() << "chip_number = " << chip_number;
            if(chip_number > 2)
            {
                ui->Reg_RButton->setEnabled(false);
                ui->Reg_WButton->setEnabled(false);
            }
        }
    }
    else
    {
        portisOpen = false;
        port->close();
        exit();
        on_ClearButton_clicked();
        ui->OpenButton->setText(tr("打开"));
        ui->OpenButton->setFont(QFont("微软雅黑", 12, QFont::Bold));
        ui->OpenButton->setStyleSheet("background-color:white;");       /* 设置样式 */
        portStatus->setText("串口状态：关闭");
    }

    /* 关联数据读取的槽函数 接收串口数据，不能直接转到槽，需要手动关联 */
    connect(port, SIGNAL(readyRead()), this, SLOT(serial_read_slot()));

}

void XNDchip_Serial::mode_Chang(uint8_t *buf, uint8_t *buf2)
{
    serialport_write(buf, 6);
    sleep(2000);
    serialport_write(buf2, 6);
    sleep(2000);
}
/*
 * @brief 将 chipType 映射到枚举值
 *
 * 该函数用于将 chipType 映射到枚举值。
 *
 * @return 枚举值
 */
XNDchip_Serial::ChipType XNDchip_Serial::getChipType(const QString &chipTypeStr) const
{
    if (chipTypeStr == "XND2152MD")
    {
        return XND2152MD;                   /* 0 */
    }
    else if (chipTypeStr == "XND2179MD")
    {
        return XND2179MD;                   /* 1 */
    }
    else if (chipTypeStr == "XND3403MD")
    {
        return XND3403MD;                   /* 2 */
    }
    else if (chipTypeStr == "AKM2157")
    {
        return AKM2157;                     /* 3 */
    }
    else
    {
        return Unknown;
    }
}


/* 字符串写入函数 */
void XNDchip_Serial::serialport_write(uint8_t *buff,int lenght)
{
    QByteArray array;
    array = array.append(reinterpret_cast<const char *>(buff), lenght);
    port->write(array);                                 /* 串口写入数据 */
    QString str = array.toHex(' ').toUpper();           /* 转换成16进制字符串并换成全大写字母*/
    display_message("Send: ");
    display_message(str);
    display_message("\r\n");
}


void XNDchip_Serial::AKM2157_serial_write(uint8_t command)
{


    uint8_t sendbuf[9] = {0};
    int i = 0;
    uint8_t Addr = 0;
    QByteArray writebuf;
    sendbuf[0] = 0xF0;      /* 帧头 */
    sendbuf[1] = 0x02;      /* 芯片号 */
    sendbuf[2] = 0x09;      /* 长度 */
    sendbuf[3] = 0x11;      /* 长度 */

    sendbuf[4] = command;

                            /* 寄存器地址 */
    sendbuf[8] = 0xFF;

    for(i = 0; i < 32; i++){
        bool ok;
        QByteArray write_data;
        QLineEdit *SendEdit = ui->groupBox_7->findChild<QLineEdit *>("AK2157_" + QString::number(i+32));
        Addr++;
        bool check = SendEdit->text().isEmpty();                   /*判断lineEdit内是否填入内容*/
        if(!check)
        {
            int reg_data = SendEdit->text().toInt(&ok, 10);         /* 以十六进制读入 */
//            sendbuf[3] = 0x20;                                      /* 命令 */
            if(Addr < 0x17)
            {
                sendbuf[5] = Addr - 1;             /*地址*/
            }
            else {
                sendbuf[5] = Addr + 3;             /*地址*/
            }

            sendbuf[6] = static_cast<uint8_t>(reg_data);
            sendbuf[7] = mybps.check_sum(sendbuf,sendbuf[2]);
            serialport_write(sendbuf,9);
            sleep(10);



        }
    }
    //serialport_write(AKM2157_REG47_Write_0,9);


}

/*
 * @brief XND2152MD芯片串口写数据
 *
 * 该函数用于串口发送数据，主要用于发送通讯协议码给下位机。
 * 包含修调寄存器的写与MTP寄存器的写
 * @return 无
 */
void XNDchip_Serial::XND2152MD_serial_write()
{
    uint8_t sendbuf[8] = {0};
    int i = 0;
    uint8_t Addr = 0xE0;
    QByteArray writebuf;
    sendbuf[0] = 0xF0;      /* 帧头 */
    sendbuf[1] = 0x01;      /* 芯片号 */
    sendbuf[2] = 0x08;      /* 长度 */

    sendbuf[4] = 0xD1;      /* 寄存器地址 */
    sendbuf[7] = 0xFF;

    /* 修调寄存器写 */
    if (Reg_WOpen)
    {
        for(i = 0; i < 14; i++){
            bool ok;
            QByteArray write_data;
            QLineEdit *SendEdit = ui->groupBox->findChild<QLineEdit *>("lineEdit_" + QString::number(i));
            Addr++;
            bool check = SendEdit->text().isEmpty();                   /*判断lineEdit内是否填入内容*/
            if(!check)
            {
                int reg_data = SendEdit->text().toInt(&ok, 10);         /* 以十六进制读入 */
                sendbuf[3] = 0x20;                                      /* 命令 */
                if(Addr < 0xEF)
                {
                    sendbuf[4] = Addr - 1;             /*地址*/
                }

                sendbuf[5] = static_cast<uint8_t>(reg_data);
                sendbuf[6] = mybps.check_sum(sendbuf,sendbuf[2]);
                serialport_write(sendbuf,8);
                sleep(10);
            }
        }
    }
    else if (writeOpen)
    {
        serialport_write(XND2152MD_R_W_ENABLE, 8);        /* 读写使能 */
        sleep(10);
        serialport_write(XND2152MD_Reg_Erase, 11);        /* 擦除操作 */
        sleep(1000);
        for(i = 0; i < 14; i++)
        {
            bool ok;
            QByteArray write_data;
            QLineEdit *SendEdit = ui->groupBox->findChild<QLineEdit *>("lineEdit_" + QString::number(i));
            int data = SendEdit->text().toInt(&ok, 10);             /* 将字符转成十六进制数 */
            qDebug() << "data =" << data;
            sendbuf[3] = 0x13;      /* 命令 */

            /* MTP存储器写数据，按BIT进行写入 */
            for (int j = 0; j < XND2152MD_Reg_bits[i]; j++)
            {
//                qDebug() << "Reg_bits[i] =" << Reg_bits[i];
                uint8_t data_w = 0;
                if(i < 13)
                {
                    /* 取出数值的某一位转成16进制并左移7位 */
                    data_w = static_cast<uint8_t>(mybps.GetBit(data, j).toInt(&ok, 16) << 7);
                    qDebug() << "data_w =" << data_w;
                    data_w |=(i * 8 + j);                                    /* 数值或上地址组成一个新的数值 */
                }
                else{
                    /* EMOD寄存器：x001xxxx */
                    data_w = static_cast<uint8_t>(mybps.GetBit(data, j + 4).toInt(&ok, 16) << 7);
                    data_w |=(i * 8 + 4 + j);                                /* 数值或上地址组成一个新的数值 */
                }
//                qDebug() << "data_w =" << data_w;
//                QString mid_data = QString::number(data_w,16);
//                qDebug() << "mid_data =" << mid_data;
//                String2Hex(mid_data, write_data);
                sendbuf[5] = data_w;
                qDebug() << "sendbuf[5] =" << sendbuf[5] ;
                sendbuf[6] = mybps.check_sum(sendbuf,sendbuf[2]);
                serialport_write(sendbuf,8);
//                    qDebug() << "data send";
                sleep(2);
                serialport_write(XND2152MD_W_Ctr,12);
//                    qDebug() << "data send2";
                sleep(2);
            }
        }
        /* MTP写入数据后需要对REG15写入0xA5 */
        for (uint8_t k = 0; k < 8; k++)
        {
            bool ok;
            sendbuf[3] = 0x13;      /* 命令 */
            /* 取出数值的某一位转成16进制并右移7位 */
            uint8_t MTP_operant = static_cast<uint8_t>(mybps.GetBit(0xA5, k).toInt(&ok, 16) << 7);
            MTP_operant |=(120 + k);                /* 数值或上地址组成一个新的数值 */
            sendbuf[5] = MTP_operant;
            sendbuf[6] = mybps.check_sum(sendbuf,sendbuf[2]);
            serialport_write(sendbuf,8);
    //        qDebug() << "data send3";
            sleep(1);
            serialport_write(XND2152MD_W_Ctr,12);
    //        qDebug() << "data send4";
            sleep(10);
        }
    }
}

/*
 * @brief 串口写数据
 *
 * 该函数用于串口发送数据，主要用于发送通讯协议码给下位机。
 *
 * @return 无
 */


/* AKM2157芯片写入数据 */

void XNDchip_Serial::serial_write_slot()
{
    switch (chip_number)
    {
        case XND2152MD:
            XND2152MD_serial_write();
            break;
        case XND2179MD:

            break;
        case XND3403MD:

            break;
        case AKM2157:

            AKM2157_serial_write(0x02);

        break;
        case Unknown:
            qWarning("Unknown chip type selected.");
            break;
        default:
            break;
    }
}

/* 修调寄存器写操作 */
void XNDchip_Serial::on_Reg_WButton_clicked()
{
    QString chipTypeStr = ui->CHIP_comboBox->currentText();
    ChipType chip_code = getChipType(chipTypeStr);
    if(chip_code == chip_number)
    {
        if(port->isOpen())
        {
            serialport_write(RW_MODE, 6);
            sleep(2000);
    //        mode_Chang(POWER_5V, RW_MODE);                  /* 电压切换到5V，读写模式 */
            /* 更改工作状态 */
            workStatus->setText("工作状态： 修调寄存器写入");
            display_message("修调寄存器正在写入... ...");
            display_message("\r\n");

            ui->Reg_RButton->setEnabled(false);
            ui->MTP_WriteButton->setEnabled(false);
            ui->MTP_ReadButton->setEnabled(false);

            Reg_WOpen = true;

            serial_write_slot();            /* 数据处理 */

            sleep(1000);

            ui->Reg_RButton->setEnabled(true);
            ui->MTP_WriteButton->setEnabled(true);
            ui->MTP_ReadButton->setEnabled(true);

            Reg_WOpen = false;

            serialport_write(FRE_MODE, 6);
            sleep(500);

//            mode_Chang(POWER_3V, FRE_MODE);                  /* 电压切换到3.3V，测频模式 */
            display_message("修调寄存器写入完成！");
            display_message("\r\n");
            workStatus->setText("工作状态： 空闲状态");

        }
        else {
            QMessageBox::warning(this, "错误提示", "串口未打开！！！");
        }
    }
    else {
        QMessageBox::warning(this, "错误提示", "芯片选择错误，请关闭串口重新选择芯片！！！");
    }
}

void XNDchip_Serial::on_MTP_WriteButton_clicked()
{
    QString chipTypeStr = ui->CHIP_comboBox->currentText();
    ChipType chip_code = getChipType(chipTypeStr);
    if(chip_code == chip_number)
    {
        if(port->isOpen())
        {
            if(chip_number > 2)
            {
                mode_Chang(POWER_3V, RW_MODE);                  /* 电压切换到3.3V，读写模式 */
            }
            else {
                mode_Chang(POWER_5V, RW_MODE);                  /* 电压切换到5V，读写模式 */
            }
    //        mode_Chang(POWER_5V, RW_MODE);                  /* 电压切换到5V，读写模式 */
            workStatus->setText("工作状态： MTP修调寄存器正在写入");
            display_message("MTP寄存器正在写入... ...");
            display_message("\r\n");

            ui->Reg_WButton->setEnabled(false);
            ui->Reg_RButton->setEnabled(false);
            ui->MTP_WriteButton->setEnabled(false);
            ui->MTP_ReadButton->setEnabled(false);

            writeOpen = true;

            serial_write_slot();                    /* 数据处理 */

            sleep(1000);

            ui->Reg_WButton->setEnabled(true);
            ui->MTP_WriteButton->setEnabled(true);
            ui->MTP_ReadButton->setEnabled(true);
            ui->Reg_RButton->setEnabled(true);

            writeOpen = false;

            mode_Chang(POWER_3V, FRE_MODE);                  /* 电压切换到3.3V，测频模式 */

            workStatus->setText("工作状态： MTP寄存器写入完成");
            display_message("MTP寄存器写入完成!");
            display_message("\r\n");
        }
        else {
            QMessageBox::warning(this, "错误提示", "串口未打开！！！");
        }
    }
    else {
        QMessageBox::warning(this, "错误提示", "芯片选择错误，请关闭串口重新选择芯片！！！");
    }
}

//void XNDchip_Serial::serial_read_slot()
//{
////    QString chipTypeStr = ui->CHIP_comboBox->currentText();
////    ChipType chiptype = getChipType(chipTypeStr);
////    qDebug() << "chipType = " << chiptype;
//    switch (chip_number)
//    {
//        case XND2152MD:
//            XND2152MD_serial_read();
//            break;
//        case XND2179MD:

//            break;
//        case XND3403MD:

//            break;
//        case AKM2157:

//            break;
//        case Unknown:
//            qWarning("Unknown chip type selected.");
//            break;
//    }
//}

void XNDchip_Serial::serial_read_slot()
{
    bool ok;
    QString Recv_array[100];
    QStringList array_list;
    sleep(4);
    QByteArray Recv_data = port->readAll().toHex().toUpper();       /*将读取的字符转化为16进制并大写*/

    QList<QLineEdit *>lineEdits =ui->groupBox_7->findChildren<QLineEdit*>();          /*获取所有QlineEdit*/


    if(!Recv_data.isEmpty())                                        /* 判断是否有数据进来 */
    {
        qDebug() <<"Recv_data = " << Recv_data;
        int len = Recv_data.length();                                   /*计算长度*/
        qDebug() <<"len = " << len;
        /* 读AKM2157寄存器的值 */
        if(len == 76)
        {
            for(int i = 0; i < len; i+=2)
            {
                array_list += Recv_data.mid(i, 2);                          /*两个元素为一组*/
            }
            for (int i = 0; i < array_list.size(); i++) {
                Recv_array[i] = array_list[i];                              /*将元素写入字符数组中*/
                qDebug() << "Recv_array[i] = " << Recv_array[i];
            }
            if(Recv_array[0] == "F1" && Recv_array[37] == "FF")
            {
                for(int i = 0; i < 32; i++)
                {
                    int array_dec;

                    QLineEdit *ReadEdit = ui->groupBox_7->findChild<QLineEdit *>("AK2157_" + QString::number(i));        /*寻找填写line_edit*/
                    array_dec = Recv_array[i+4].toInt(&ok,16);                          /*将数据转化为10进制*/
                    ReadEdit->setText(QString::number(array_dec));                      /*在Line_edit中十进制显示数据*/
                }
            }
            else {
                display_message("Data Error! ");
                display_message("\r\n");
            }
        }
        /* 读XND2152MD寄存器的值 */
        else if(len == 40)
        {
            for(int i = 0; i < len; i+=2)
            {
                array_list += Recv_data.mid(i, 2);                          /*两个元素为一组*/
            }
            for (int i = 0; i < array_list.size(); i++) {
                Recv_array[i] = array_list[i];                              /*将元素写入字符数组中*/
                qDebug() << "Recv_array[i] = " << Recv_array[i];
            }
            if(Recv_array[0] == "F1" && (Recv_array[3] == "16" || Recv_array[3] == "14") && Recv_array[4] != "FF")
            {
                for(int i = 0; i < 14; i++)
                {
                    int array_dec;
                    QLineEdit *ReadEdit = ui->groupBox->findChild<QLineEdit *>("lineEdit_" + QString::number(i + 14));        /*寻找填写line_edit*/
                    array_dec = Recv_array[i+4].toInt(&ok,16);                          /*将数据转化为10进制*/
                    ReadEdit->setText(QString::number(array_dec));                      /*在Line_edit中十进制显示数据*/
                }
            }
            else {
                display_message("Data Error! ");
                display_message("\r\n");
            }
        }
        else if(len == 12)              /* 返回状态码 */
        {
            QString recv_string;
            for (int i = 0; i < len; i+=2) {
                recv_string += Recv_data.mid(i, 2) + " ";
            }

            display_message("Recv: ");
            display_message(recv_string);
            display_message("\r\n");
        }
        else        /* 读MTP的位数值len = 14*/
        {
            /* 下位机返回 F1 01 07 14 XX ORC FF */
            qDebug() <<"Recv_data = " << Recv_data;
            int len = Recv_data.length();                                   /*计算长度*/
            qDebug() <<"len = " << len;
        }
    }
    Recv_data.clear();
    port->clear();
}
                                                   /*清除接收缓冲区，等待下一次数据的到来*/

/* 串口读MTP数据 */
void XNDchip_Serial::MTP_Bit_Read()
{
    uint8_t sendbuf[8] = {0xF0, 0x01, 0x08, 0x21, 0xD1, 0x00, 0x00, 0xFF};
    QByteArray write_read_buf;
    int i = 0;
    for (i = 0; i < 14; i++)
    {
        for (int j = 0; j < XND2152MD_Reg_bits[i]; j++)
        {
            if(i < 13)
            {
                sendbuf[5] =static_cast<uint8_t>( i * 8 + j);
            }
            else
            {
                sendbuf[5] =static_cast<uint8_t>( i * 8 + 4 + j);
            }

            sendbuf[6] = mybps.check_sum(sendbuf,sendbuf[2]);
            serialport_write(sendbuf,8);
//            sleep(1);
//            serialport_write(R_Build, 9);
//            sleep(1);
//            serialport_write(R_Date, 7);
            sleep(50);
        }
    }
}

/* akm2157读取寄存器值 */
void XNDchip_Serial::AKM2157_serial_read()
{

}
/*
 * @brief 发送修调寄存器数据读取命令
 *
 * 该函数用于发送修调寄存器数据读取命令给到下位机
 *
 * @return 无
 */
void XNDchip_Serial::on_Reg_RButton_clicked()
{
    QString chipTypeStr = ui->CHIP_comboBox->currentText();
    ChipType chip_code = getChipType(chipTypeStr);
    if(chip_code == chip_number)
    {
        if(port->isOpen())
        {
            serialport_write(RW_MODE, 6);
            sleep(2000);
//            mode_Chang(POWER_3V, RW_MODE);                  /* 电压切换到3.3V，读写模式 */
//            qDebug() << "3.3V输入" << "读写模式";
            /* 更改工作状态 */
            workStatus->setText("工作状态： 修调寄存器读取");
            display_message("修调寄存器正在读取... ...");
            display_message("\r\n");

            ui->Reg_WButton->setEnabled(false);
            ui->MTP_WriteButton->setEnabled(false);
            ui->MTP_ReadButton->setEnabled(false);

            switch (chip_code)
            {
            case XND2152MD:
                /* 0xF0, 0x01, 0x08, 0x16, 0xA0, 0x0E, 0xBD, 0xFF */
                serialport_write(XND2152MD_Read_REG, 8);          /* XND2152MD读修调寄存器值 */
                break;
            case XND2179MD:
                /* 0xF0, 0x06, 0x08, 0x16, 0x80, 0x0D, 0xA1, 0xFF */
                serialport_write(XND2179MD_Read_REG, 8);          /* XND2179MD读修调寄存器值 */
                break;
            case XND3403MD:
                /* 0xF0, 0x07, 0x08, 0x16, 0x80, 0x1B, 0xB0, 0xFF */
                serialport_write(XND2179MD_Read_REG, 8);          /* XND2179MD读修调寄存器值 */
                break;
            case Unknown:
                qWarning("Unknown chip type selected.");
                break;
            }
            sleep(1000);
//            mode_Chang(POWER_3V, FRE_MODE);                  /* 电压切换到3.3V，测频模式 */
        //    ui->Reg_RButton->setEnabled(true);
            ui->MTP_WriteButton->setEnabled(true);
            ui->Reg_WButton->setEnabled(true);
            ui->MTP_ReadButton->setEnabled(true);

            serialport_write(FRE_MODE, 6);                  /* 测频模式 */
            sleep(1000);
            display_message("修调寄存器读取完成！");
            display_message("\r\n");
            sleep(2);
            workStatus->setText("工作状态： 空闲状态");

        }
        else {
            QMessageBox::warning(this, "错误提示", "串口未打开！！！");
        }
    }
    else {
        QMessageBox::warning(this, "错误提示", "芯片选择错误，请关闭串口重新选择芯片！！！");
    }
}

void XNDchip_Serial::on_MTP_ReadButton_clicked()
{
    workStatus->setText("工作状态： MTP寄存器读取");
    display_message("MTP寄存器正在读取... ...");
    display_message("\r\n");
    if(port->isOpen())
    {
        if(chip_number > 2)
        {
            mode_Chang(POWER_3V, RW_MODE);                  /* 电压切换到3.3V，读写模式 */
            qDebug() << "3.3V输入";
        }
        else {
            mode_Chang(POWER_5V, RW_MODE);                  /* 电压切换到5V，读写模式 */
            qDebug() << "5V输入";
        }
        ui->Reg_WButton->setEnabled(false);
        ui->MTP_WriteButton->setEnabled(false);
        ui->MTP_ReadButton->setEnabled(false);
        ui->Reg_RButton->setEnabled(false);

        switch (chip_number)
        {
        case XND2152MD:
            serialport_write(XND2152MD_R_W_ENABLE,0x08);
            sleep(10);
            MTP_Bit_Read();;          /* XND2152MD读MTP寄存器值 */
            break;
        case XND2179MD:
//            serialport_write(XND2179MD_Read_REG, 8);          /* XND2179MD读修调寄存器值 */
            break;
        case XND3403MD:
            /* 0xF0, 0x07, 0x08, 0x16, 0x80, 0x1B, 0xB0, 0xFF */
            serialport_write(XND2179MD_Read_REG, 8);            /* XND2179MD读修调寄存器值 */
            break;
        case AKM2157:
            /* 0xF0, 0x02, 0x07, 0x12, 0x05, 0x10, 0xFF */
            serialport_write(AKM2157_Read_REG, 7);              /* AKM2157读寄存器值 */
            break;
        case Unknown:
            qWarning("Unknown chip type selected.");
            break;
        }
        sleep(100);
        ui->Reg_WButton->setEnabled(true);
        ui->Reg_RButton->setEnabled(true);
        ui->MTP_WriteButton->setEnabled(true);
        ui->MTP_ReadButton->setEnabled(true);
    }
    mode_Chang(POWER_3V, FRE_MODE);                  /* 电压切换到3.3V，测频模式 */
    workStatus->setText("工作状态： MTP寄存器读取完成");
    display_message("MTP寄存器读取完成!");
    display_message("\r\n");
}



/* 延时函数 */
void XNDchip_Serial::sleep(int mesc)
{
    QTime reachtime = QTime::currentTime().addMSecs(mesc);

    while (QTime::currentTime() < reachtime) {
        QApplication::processEvents(QEventLoop::AllEvents,100);
    }
}

/*
 * @brief 清除数据接收区
 *
 * 该函数用于清楚数据区产生的数据。
 *
 * @return 无
 */
void XNDchip_Serial::exit()
{
//    QList<QLineEdit *>lineEdits =ui->XND_stackedWidget->findChildren<QLineEdit*>();          /*获取所有QlineEdit*/
//    /* 遍历所有lineEdit元素 */
//    for (QLineEdit *lineEdit : lineEdits)
//    {
//        qDebug() << lineEdit;
//    }
    for(int i = 0; i < 104; i++)
    {
        QLineEdit *lineEdit_E = ui->XND_stackedWidget->findChild<QLineEdit *>("lineEdit_" + QString::number(i));
        lineEdit_E->clear();
    }
}



/*
 * @brief 清除数据接收区
 *
 * 该函数用于清楚数据区产生的数据。
 *
 * @return 无
 */
void XNDchip_Serial::on_ClearButton_clicked()
{
    ui->dataEdit->clear();
}

/* 复制 */
void XNDchip_Serial::on_Copy_Button_clicked()
{
    QString chipTypeStr = ui->CHIP_comboBox->currentText();
    ChipType chip_code = getChipType(chipTypeStr);
    qDebug() << "chip_code = " << chip_code;
    switch (chip_number)
    {
        case XND2152MD:
                XND2152MD_COPY();
                break;
        case XND2179MD:

                break;
        case XND3403MD:

                break;
         case AKM2157:
                AKM2157_COPY();
            break;
        case Unknown:
                qWarning("Unknown chip type selected.");
                break;
    }
}

void XNDchip_Serial::XND2152MD_COPY()
{
//    QList<QLineEdit *>lineEdits =ui->groupBox->findChildren<QLineEdit*>();          /*获取所有QlineEdit*/
//    /* 遍历所有lineEdit元素 */
//    for (QLineEdit *lineEdit : lineEdits)
//    {
//        qDebug() << lineEdit;
//    }
//    for(int i = 0; i < 14; i++)
//    {
//        QLineEdit *edit = ui->groupBox->findChild<QLineEdit *>("lineEdit_" + QString::number(i));        /*寻找line_edit*/
//        edit->setText(lineEdits.at(i)->text());
//    }
    for (int i = 0; i <= 13; ++i) {
        QLineEdit *src = ui->groupBox->findChild<QLineEdit*>("lineEdit_" + QString::number(i));
        QLineEdit *dst = ui->groupBox->findChild<QLineEdit*>("lineEdit_" + QString::number(i+14));
        if (src && dst) {
            src->setText(dst->text()); // 将源控件文本复制到目标控件
        }
    }
}

void XNDchip_Serial::AKM2157_COPY()
{
    for (int i = 0; i <= 31; ++i) {
        QLineEdit *src = ui->groupBox_7->findChild<QLineEdit*>("AK2157_" + QString::number(i + 32));
        QLineEdit *dst = ui->groupBox_7->findChild<QLineEdit*>("AK2157_" + QString::number(i));
        if (src && dst) {
            src->setText(dst->text()); // 将源控件文本复制到目标控件
        }
    }
}

/* 在接收区显示数据(从串口读取的和发送的) */
void XNDchip_Serial::display_message(QString str)
{
    /* 在当前光标处插入文本 */
    ui->dataEdit->insertPlainText(str);

    /* 返回表示当前可见游标的QTextCursor副本。
     *注意，对返回游标的更改不会影响QTextEdit的游标;使用setTextCursor()更新可见的游标
     */
    QTextCursor cursor = ui->dataEdit->textCursor();

    /* 将光标移动到文档的最后 */
    cursor.movePosition(QTextCursor::End);

    /* 更新光标 */
    ui->dataEdit->setTextCursor(cursor);
}


void XNDchip_Serial::on_REG47_128_clicked()
{
    serialport_write(RW_MODE, 6);
    sleep(2000);
    serialport_write(AKM2157_REG47_Write_128,9);
    sleep(10);
    serialport_write(FRE_MODE,6);
}


void XNDchip_Serial::on_REGRead_clicked()
{
    serialport_write(RW_MODE, 6);
    sleep(2000);
    serialport_write(AKM2157_RamRead,7);
    sleep(100);
    serialport_write(FRE_MODE,6);
}

void XNDchip_Serial::on_REG47_0_clicked()
{
    serialport_write(RW_MODE, 6);
    sleep(2000);
    serialport_write(AKM2157_REG47_Write_0,9);
    sleep(10);
    serialport_write(FRE_MODE,6);
}

void XNDchip_Serial::on_RamWrite_clicked()
{
    serialport_write(RW_MODE, 6);
    sleep(2000);
    AKM2157_serial_write(0x03);
    sleep(100);
    serialport_write(FRE_MODE,6);
}


void XNDchip_Serial::on_REG47_128_READ_clicked()
{
    serialport_write(RW_MODE, 6);
    sleep(2000);
    serialport_write(AKM2157_REG47_READ,8);
    serialport_write(FRE_MODE,6);
}

